/*
 * Copyright (C) 2018 Logos Technology Ltd.
 */

package com.logos.tool.collection;

import java.util.List;

/**
 * 常用List操作 注意线程安全！
 */
public class ListUtils {

    /**
     * 清除集合
     *
     * @param list 需要清空的集合
     * @param <T>  泛型.
     */
    public static <T> void clear(List<T> list) {
        if (null == list) {
            return;
        }
        list.clear();
    }

    /**
     * 获取数量
     *
     * @param list 集合
     * @param <T>  泛型
     * @return 集合大小.
     */
    public static <T> int getCount(List<T> list) {
        if (null == list || list.isEmpty()) {
            return 0;
        }
        return list.size();
    }

    /**
     * 获取条目数
     *
     * @param list     集合
     * @param position 位置
     * @param <T>      泛型
     * @return 具体位置对应的条目.
     */
    public static <T> T getItem(List<T> list, int position) {
        if (null == list || list.isEmpty()) {
            return null;
        }
        if (position < 0 || position >= list.size()) {
            return null;
        }
        return list.get(position);
    }

    /**
     * 获取位置
     *
     * @param list     集合
     * @param itemData 条目数据
     * @param <T>      泛型
     * @return 具体条目位置.
     */
    public static <T> int getPosition(List<T> list, T itemData) {
        if (null == list || list.isEmpty() || itemData == null) {
            return -1;
        }
        return list.indexOf(itemData);
    }

    /**
     * 子集
     *
     * @param list  集合
     * @param start 开始位置
     * @param end   结束位置
     * @return 获取子集.
     */
    public static List<String> subList(List<String> list, int start, int end) {
        int listSize = getCount(list);
        if (listSize <= 0) {
            return null;
        }
        if (start < 0 || end > listSize) {
            return null;
        }
        return list.subList(start, end);
    }

    /**
     * 是否为空
     *
     * @param list list
     * @param <T>  T
     * @return boolean
     */
    public static <T> boolean isEmpty(List<T> list) {
        return (getCount(list) <= 0);
    }

    /**
     * 删除
     *
     * @param list     集合
     * @param position 位置
     * @param <T>      泛型
     * @return 返回是否删除值.
     */
    public static <T> T remove(List<T> list, int position) {
        if (null == list || list.isEmpty()) {
            return null;
        }
        if (position < 0 || position >= list.size()) {
            return null;
        }
        return list.remove(position);
    }

    /**
     * 添加
     *
     * @param list 集合
     * @param item 条目
     * @param <T>  泛型
     * @return 返回是否添加成功值.
     */
    public static <T> boolean add(List<T> list, T item) {
        if (list == null) {
            return false;
        }
        return list.add(item);
    }

    /**
     * 在指定index插入item
     *
     * @param list     集合
     * @param position 位置
     * @param item     条目
     * @param <T>      泛型
     * @return 是否插入成功.
     */
    public static <T> boolean add(List<T> list, int position, T item) {
        if (list == null || position > list.size() || position < 0) {
            return false;
        }
        list.add(position, item);
        return true;
    }
}
